package com.da.springtest.scan;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @author chenlida
 * @date 2020/6/21 16:14
 * 1.@ComponentScan用于批量注册bean，spring会按照这个注解的配置，递归扫描指定包中的所有类，将满足条件的类批量注册到spring容器中
 *
 * 2.可以通过value、basePackages、basePackageClasses 这几个参数来配置包的扫描范围
 *
 * 3.可以通过useDefaultFilters、includeFilters、excludeFilters这几个参数来配置类的过滤器，被过滤器处理之后剩下的类会被注册到容器中
 *
 * 4.指定包名的方式配置扫描范围存在隐患，包名被重命名之后，会导致扫描实现，所以一般我们在需要扫描的包中可以创建一个标记的接口或者类，
 * 作为basePackageClasses的值，通过这个来控制包的扫描范围
 *
 * 5.@CompontScan注解会被ConfigurationClassPostProcessor类递归处理，最终得到所有需要注册的类。
 */
public class TestMethod {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ScanBean1.class);
        show(context);

        System.out.println("---------------------------");

        AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext(ScanBean2.class);
        show(context2);

        System.out.println("---------------------------");

        AnnotationConfigApplicationContext context3 = new AnnotationConfigApplicationContext(ScanBean3.class);
        show(context3);
    }

    private static void show(AnnotationConfigApplicationContext context) {
        for (String beanName : context.getBeanDefinitionNames()) {
            System.out.println(beanName + "->" + context.getBean(beanName));
        }
    }
}
